package Cliente;

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import Socket.SocketBytes;

public class Cliente extends JFrame {
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JTextField campoIntroducir;
    private JTextArea areaPantalla;
    private int iniport; // Puerto de conexi�n
    private int nomcliente; // Nombre del client
    private String host; // M�quina donde est� al servidor concurrente
    private SocketBytes socket; // Socket de comunicaci�n con hilo de servidor concurrente
 
    // configurar GUI y DatagramSocket
    public Cliente(int iniport_in, int nom_in, String host_in) throws IOException, ClassNotFoundException
    {
    	
       super( "Jugador: " + nom_in);
       
       
       iniport = iniport_in;
       nomcliente = nom_in;
       host = host_in;
 
       Container contenedor = getContentPane();
       
       campoIntroducir = new JTextField( "" );
       campoIntroducir.addActionListener(
          new ActionListener() { 
             public void actionPerformed( ActionEvent evento ) {
                // crear y enviar el paquete
                try {
                   areaPantalla.append( "\nEnviando paquete que contiene: " +
                      evento.getActionCommand() + "\n" );
 
                   // obtener mensaje del campo de texto y convertirlo en arreglo byte
                   String mensaje = evento.getActionCommand();
                   socket.enviaMensaje( Integer.parseInt(mensaje) ); // enviar paquete
                   //Recibe si la contestacion estubo bien
                   //y la siguiente pregunta
                   areaPantalla.append((String) socket.recibeMensaje());
                   areaPantalla.append("\nPaquete enviado\n" );
                   areaPantalla.setCaretPosition( 
                   areaPantalla.getText().length() );
                   campoIntroducir.setText("");
                }
 
                // procesar los problemas que pueden ocurrir al crear o enviar el paquete
                catch ( IOException excepcionES ) {
                   mostrarMensaje( excepcionES.toString() + "\n" );
                   excepcionES.printStackTrace();
                } catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
 
             } // fin de actionPerformed
 
          } // fin de la clase interna
 
       ); // fin de la llamada a addActionListener
       
       
       
       contenedor.add( campoIntroducir, BorderLayout.SOUTH );
       
       
       
       areaPantalla = new JTextArea();
       
       
       
       contenedor.add( new JScrollPane( areaPantalla ),
          BorderLayout.CENTER );
       
       
       
       setSize( 400, 300 );
       setVisible( true );
       
       
       
      // crear objeto DatagramSocket para enviar y recibir paquetes
       try {
    	   
          socket = new SocketBytes(host, iniport);
          //Envia mensaje al servidor con su numero.
          socket.enviaMensaje(nom_in);
          //Muestra la primera pregunta que le envia el servidor.
          //areaPantalla.append((String) socket.recibeMensaje());System.out.println("crazy love12");
       }
 
      // atrapar los problemas que pueden ocurrir al crear objeto DatagramSocket
      catch( SocketException excepcionSocket ) {
          excepcionSocket.printStackTrace();
          System.exit( 1 );
       }
       
       
 
    } // fin del constructor de Cliente

    // esperar a que lleguen los paquetes del Servidor, mostrar el contenido de los paquetes
    public void esperarPaquetes()
    {
       while ( true ) { // iterar infinitamente
 

 
       } // fin de instrucción while
 
    } // fin del método esperarPaquetes
    
    
    // método utilitario que es llamado desde otros subprocesos para manipular a
   // areaPantalla en el subproceso despachador de eventos
    private void mostrarMensaje( final String mensajeAMostrar )
    {
       // mostrar mensaje del subproceso de ejecución despachador de eventos
       SwingUtilities.invokeLater(
          new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente
 
             public void run() // actualiza areaPantalla
             {
            	while(true){
            		areaPantalla.append( mensajeAMostrar );
            		areaPantalla.setCaretPosition( 
            		areaPantalla.getText().length());
            	}
             }
 
          }  // fin de la clase interna
 
       ); // fin de la llamada a SwingUtilities.invokeLater
    }

 }  // fin de la clase Cliente 
